package com.zhiliao.spi.demo1;//package com.zhiliao.spi.demo1;
//
//import java.io.IOException;
//import java.security.AccessControlContext;
//import java.util.Iterator;
//import java.util.LinkedHashMap;
//
//public final class ServiceLoader<S> implements Iterable<S> {
//
//
//    //扫描目录前缀
//    private static final String PREFIX = "META-INF/services/";
//
//    // 被加载的类或接口
//    private final Class<S> service;
//
//    // 用于定位、加载和实例化实现方实现的类的类加载器
//    private final ClassLoader loader;
//
//    // 上下文对象
//    private final AccessControlContext acc;
//
//    // 按照实例化的顺序缓存已经实例化的类
//    private LinkedHashMap<String, S> providers = new LinkedHashMap<>();
//
//    // 懒查找迭代器
//    private java.util.ServiceLoader.LazyIterator lookupIterator;
//
//    // 私有内部类，提供对所有的service的类的加载与实例化
//    private class LazyIterator implements Iterator<S> {
//        Class<S> service;
//        ClassLoader loader;
//        Enumeration<URL> configs = null;
//        String nextName = null;
//
//        //...
//        private boolean hasNextService() {
//            if (configs == null) {
//                try {
//                    //获取目录下所有的类
//                    String fullName = PREFIX + service.getName();
//                    if (loader == null)
//                        configs = ClassLoader.getSystemResources(fullName);
//                    else
//                        configs = loader.getResources(fullName);
//                } catch (IOException x) {
//                    //...
//                }
//                //....
//            }
//        }
//
//        private S nextService() {
//            String cn = nextName;
//            nextName = null;
//            Class<?> c = null;
//            try {
//                //反射加载类
//                c = Class.forName(cn, false, loader);
//            } catch (ClassNotFoundException x) {
//            }
//            try {
//                //实例化
//                S p = service.cast(c.newInstance());
//                //放进缓存
//                providers.put(cn, p);
//                return p;
//            } catch (Throwable x) {
//                //..
//            }
//            //..
//        }
//    }
//}
